package com.example;

import com.example.controller.AIController;
import com.example.controller.impl.AIControllerImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Auther: ${USER}
 * @Date: ${YEAR}/${MONTH}/${DAY}/${TIME}
 * @Description:
 */
public class Main {
    public static void main(String[] args) {
        AIControllerImpl aiController = new AIControllerImpl();
        //String answer = aiController.getAnswer("张三很帅吗？");
        //System.out.println(answer);
        // 使用动态代理增强getAnswer方法
        // 1.JDK动态代理
        // 获取类加载器
        ClassLoader classLoader = Main.class.getClassLoader();
        // 被代理类所实现接口的字节码对象数组
        Class<?>[] interfaces = AIControllerImpl.class.getInterfaces();
        // 使用代理对象（proxy）时，会调用invoke
        AIController proxy = (AIController) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // proxy是代理对象
                // method是当前被调用的方法封装的Method对象
                // args是调用方法时传入的参数
                // 调用被代理对象的对应方法
                // 判断当前调用的是否是getAnswer方法
                if ("getAnswer".equals(method.getName())) {
                    System.out.println("已增强");
                }
                Object ret = method.invoke(aiController, args);
                return ret;
            }
        });
        String answer1 = proxy.getAnswer("张三很帅？");
        System.out.println(answer1);
    }
}